//package com.geese.module.security.core;
//
//import java.util.Date;
//import java.util.HashMap;
//import java.util.Map;
//
//import org.springframework.mobile.device.Device;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.stereotype.Component;
//
//import com.geese.common.DateUtil;
//import com.geese.common.JedisUtil;
//import com.geese.module.user.model.SecurityUser;
//
//import io.jsonwebtoken.Claims;
//import io.jsonwebtoken.Jwts;
//import io.jsonwebtoken.SignatureAlgorithm;
//
///**
// * Created by Z先生 on 2017/3/2.
// */
//@Component
//public class TokenUtils {
//
//    private final String AUDIENCE_UNKNOWN = "unknown";
//    private final String AUDIENCE_WEB = "web";
//    private final String AUDIENCE_MOBILE = "mobile";
//    private final String AUDIENCE_TABLET = "tablet";
//
//    //密匙
//    private String secret = "ssshhhhh!";
//    /**
//     * token失效时间
//     */
//    private Long expiration = 604800L;
//
//
//    public Boolean validateToken(String token, UserDetails userDetails) {
//        SecurityUser user = (SecurityUser) userDetails;
//        final String username = this.getUsernameFromToken(token);
//        final Date created = this.getCreatedDateFromToken(token);
//        return (username.equals(user.getUsername()) && !(this.isTokenExpired(token)) && !(this.isCreatedBeforeLastPasswordReset(created, user.getLastPasswordReset())) && !JedisUtil.exists(token));
//    }
//
//
//    private Boolean isCreatedBeforeLastPasswordReset(Date created, Date lastPasswordReset) {
//        return (lastPasswordReset != null && created.before(lastPasswordReset));
//    }
//
//
//    public Date getExpirationDateFromToken(String token) {
//        Date expiration;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//            expiration = claims.getExpiration();
//        } catch (Exception e) {
//            expiration = null;
//        }
//        return expiration;
//    }
//
//
//    private Boolean isTokenExpired(String token) {
//        final Date expiration = this.getExpirationDateFromToken(token);
//        return expiration.before(this.generateCurrentDate());
//    }
//
//    private Date generateCurrentDate() {
//        return new Date(System.currentTimeMillis());
//    }
//
//    public Date getCreatedDateFromToken(String token) {
//        Date created;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//
//            created = new Date((Long) claims.get("created"));
//        } catch (Exception e) {
//            created = null;
//        }
//        return created;
//    }
//
//    /**
//     * 访问来源
//     */
//    private String generateAudience(Device device) {
//        String audience = this.AUDIENCE_UNKNOWN;
//        if (device.isNormal()) {
//            audience = this.AUDIENCE_WEB;
//        } else if (device.isTablet()) {
//            audience = AUDIENCE_TABLET;
//        } else if (device.isMobile()) {
//            audience = AUDIENCE_MOBILE;
//        }
//        return audience;
//    }
//
//    public String getUsernameFromToken(String token) {
//        String username;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//            username = claims.getSubject();
//        } catch (Exception e) {
//            username = null;
//        }
//        return username;
//    }
//
//    public Integer getUserIdFromToken(String token) {
//        Integer userId;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//            userId = (Integer) claims.get("user_id");
//        } catch (Exception e) {
//            userId = null;
//        }
//        return userId;
//    }
//
//    public Integer getUserTypeFromToken(String token) {
//        Integer userType;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//            userType = (Integer) claims.get("user_type");
//        } catch (Exception e) {
//            userType = null;
//        }
//        return userType;
//    }
//
//
//    private Claims getClaimsFromToken(String token) {
//        Claims claims;
//        try {
//            claims = Jwts.parser()
//                    .setSigningKey(this.secret)
//                    .parseClaimsJws(token)
//                    .getBody();
//        } catch (Exception e) {
//            claims = null;
//        }
//        return claims;
//    }
//
//    public static void main(String[] args) {
//        String token = "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxMjM0IiwiYXVkaWVuY2UiOiJ3ZWIiLCJjcmVhdGVkIjoxNDg4NTE0ODExMDM2LCJleHAiOjE0ODkxMTk2MTF9.jNe96cVY4c0DQltPcRA1-mNxke26-ztXHw60XRWn9QDESbQpnRdip5NiQrFf8wieVnVBU85Ojo7zW7FAugUR_g";
//
//        TokenUtils tokenUtils = new TokenUtils();
//       /* System.out.println(tokenUtils.createToken("1234"));*/
//        System.out.println(tokenUtils.refreshToken(token));
//
//        System.out.println(tokenUtils.isTokenExpired(token));
//    }
//
//
//    public String createToken(String username) {
//        Map<String, Object> claims = new HashMap<String, Object>();
//        claims.put("sub", username);
//        claims.put("audience", "web");
//        claims.put("created", DateUtil.getNow());
//        return generateToken(claims);
//    }
//
//    public String createToken(String username, Device device) {
//        Map<String, Object> claims = new HashMap<String, Object>();
//        claims.put("sub", username);
//        claims.put("audience", this.generateAudience(device));
//        claims.put("created", DateUtil.getNow());
//        return generateToken(claims);
//    }
//
//    private String generateToken(Map<String, Object> claims) {
//        return Jwts.builder()
//                .setClaims(claims)
//                .setExpiration(this.generateExpirationDate())
//                .signWith(SignatureAlgorithm.HS512, this.secret)
//                .compact();
//    }
//
//    public String generateToken(SecurityUser userDetails) {
//        Map<String, Object> claims = new HashMap<String, Object>();
//        claims.put("user_type",userDetails.getUserType());
//        claims.put("user_id",userDetails.getUserId());
//        claims.put("sub", userDetails.getUsername());
//       // claims.put("audience", this.generateAudience(device));
//        claims.put("created", this.generateCurrentDate());
//        return this.generateToken(claims);
//    }
//
//    public String refreshToken(String token) {
//        String refreshedToken;
//        try {
//            final Claims claims = this.getClaimsFromToken(token);
//            claims.put("created", this.generateCurrentDate());
//            refreshedToken = this.generateToken(claims);
//        } catch (Exception e) {
//            refreshedToken = null;
//        }
//        return refreshedToken;
//    }
//
//    private Date generateExpirationDate() {
//        return new Date(System.currentTimeMillis() + this.expiration * 1000);
//    }
//}
